using System;
using Kaleida.ServiceMonitor.Framework;
using Kaleida.ServiceMonitor.Framework.Responses;

namespace Kaleida.ServiceMonitor.Operations.ResponseHandlers
{
    public class MustContain : ResponseHandler
    {
        private readonly string expectedContent;

        public MustContain(string expectedContent)
        {
            this.expectedContent = ReplaceSpecialCharacters(expectedContent);
        }

        public override string Description
        {
            get { return string.Format("expect the response to contain '{0}'", expectedContent); }
        }

        private static string ReplaceSpecialCharacters(string expectedResponseFragment)
        {
            return expectedResponseFragment.Replace(@"\r", "\r").Replace(@"\n", "\n");
        }

        public override string ProcessResponse(object response)
        {
            if (response is IStringContainer)
            {
                var actualContent = ((IStringContainer)response).Content;
                TestAsString(actualContent);
                return GetReturnString(actualContent);
            }

            var actualString = response.ToString();
            TestAsString(actualString);
            return GetReturnString(actualString);
        }

        private static string GetReturnString(string actualString)
        {
            return string.Format("Found string within document of length {0} character{1}", actualString.Length, actualString.Length == 1 ? "" : "s");
        }

        private void TestAsString(string actualString)
        {
            if (!actualString.Contains(expectedContent))
                throw new InvalidOperationException(string.Format("Expected response to contain '{0}' but text was not found", expectedContent));
        }
    }
}